// ### 支付按钮逻辑
// 1 先判断缓存中有没有token
// 2 没有 跳转到授权页面 进行获取token 
// 3 有token 。。。
// 4 创建订单 获取订单编号
// 5 已经完成了微信支付
// 6 手动删除缓存中 已经被选中了的商品 
// 7 删除后的购物车数据 填充回缓存
// 8 再跳转订单页面 
import { axios } from '../../request/myAxios';
import regeneratorRuntime from '../../libs/runtime/runtime';

Page({

  /**
   * 页面的初始数据
   */
  data: {
    cart: [],
    totalPrice: 0,
    totalCount: 0,
    userAdress: {}
  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {
    // 从本地存储中获取购物车数据
    const cart = wx.getStorageSync('cart') || [];
    // 计算总金额和选个商品数
    this.cartComputed(cart);

    // 从本地存储中获取用户信息，并绑定到页面中
    const userAdress = wx.getStorageSync('userAdress') || {};
    // 把用户信息绑定到页面中
    this.setData({ userAdress });
  },

  // 购物车计算封装
  cartComputed(cart) {
    // console.log(cart);
    // 计算前，把总金额和选中个数初始化为0
    let totalPrice = 0,
      totalCount = 0;
    // 遍历购物车数组，计算总金额和选中个数
    cart.forEach(item => {
      if (item.isSelect) {
        // 累加总价格
        totalPrice += item.number * item.goods_price;
        // 累加选中个数(不是商品格式)
        totalCount++;
      }
    });
    // 把总价格和选中的个数在页面中更新
    this.setData({
      totalPrice, totalCount, cart
    });

  },

  // 获取用户地址
  getUserAddress() {
    // 1. 获取用户地址授权情况
    wx.getSetting({
      success: (result) => {
        // console.log(result);
        const scopeAddress = result.authSetting["scope.address"];
        console.log('收货地址授权情况', scopeAddress);
        // 三情况的返回值
        // true      授权
        // false     拒绝授权
        // undefind  还没调用过接口（主动调用）

        // 2. 如果已经授权才调用收货地址接口
        if (scopeAddress === true || scopeAddress === undefined) {
          // 如果已经授权就调用收货地址接口
          wx.chooseAddress({
            success: (result) => {
              console.log('success', result);
              // 解构出需要用到的数据
              const { telNumber, userName, detailInfo, countyName, cityName, provinceName } = result;
              // 构建一个用户地址对象
              const userAdress = {
                // 用户名
                userName,
                // 用户联系方式
                telNumber,
                // 详细地址，手动拼接
                detail: provinceName + cityName + countyName + detailInfo
              };
              // 设置到页面中
              this.setData({
                userAdress
              });
              // 保存到本地存储中
              wx.setStorageSync('userAdress', userAdress);
            },
            fail: (err) => {
              console.log('fail', err);
            }
          });
        } else {
          // 3. 如果没有授权，打开设置界面
          wx.openSetting();
        }
      }
    });

  },
  // 支付按钮
  async payOrder() {
    const { userAdress } = this.data;
    // 1. 判断用户有没有收获地址
    if (!userAdress.userName) {
      // 没有收货人提示
      wx.showToast({
        title: '请选择收货人',
        icon: 'none',
      });
    }
    // 2. 判断用户是否登录
    const token = wx.getStorageSync('token');
    // 如果没有登录，提示用户，并跳转到登录授权页
    if (!token) {
      wx.showToast({
        title: '请先登录',
        icon: 'none',
        // 提示的延迟时间
        duration: 200,
        // 弹窗后自动跳转到授权页
        success: res => {
          // 3. 跳转到授权页面
          wx.navigateTo({
            url: '/pages/auth/index',
          });
        }
      });

    } else {
      // 有 token 的情况

      // 获取总价格
      const order_price = this.data.totalPrice;
      // 获取订单地址
      const consignee_addr = this.data.userAdress.detail;
      // 商品列表(数组格式)
      // 1. 过滤选中的商品 -  filter
      // 2. 把数组内的对象映射成要求格式 - map
      const goods = this.data.cart
        .filter(v => v.isSelect)
        .map(v => ({
          goods_id: v.goods_id,
          goods_number: v.number,
          goods_price: v.goods_price
        }));

      // const goods = [];
      // this.data.cart.forEach(item=>{
      //   if( item.isSelect ){
      //     goods.push({
      //       goods_id: item.goods_id,
      //       goods_number: item.number,
      //       goods_price: item.goods_price
      //     })
      //   }
      // });

      try {
        // 4.1 创建订单 获取订单编号
        const { order_number } = await axios({
          method: 'POST',
          url: '/my/orders/create',
          data: {
            // 订单总价格
            order_price,
            // 订单地址
            consignee_addr,
            // 商品列表(数组格式)
            goods
          }
        });
        // console.log('order_number', order_number);
        // 4.2 通过订单号生成微信支付需要的参数(对象格式)
        const { pay } = await axios({
          method: 'POST',
          url: '/my/orders/req_unifiedorder',
          data: { order_number }
        });
        // console.log('pay', pay);
        // 4.3 调用微信微信支付
        await wx.requestPayment(pay);
        // 4.4 发请求，检查订单是否已支付，已支付由后端更新订单状态
        //  问一下微信服务器是否收到钱了，如果收到钱，就更新订单状态
        // 小程序端无法直接发送请求到微信服务器，都是让公司服务器向微信服务器发请求检验状态
        await axios({
          method: 'POST',
          url: '/my/orders/chkOrder',
          data: { order_number }
        });
        // 支付成功后的处理
        this.payOrderSuccess();
      } catch (error) {
        // 失败提示
        wx.showToast({
          title: '出现错误，支付失败',
          icon: 'none',
        });
      }
      // 6 手动删除缓存中 已经被选中了的商品
      // 7 删除后的购物车数据 填充回缓存
      // 8 再跳转订单页面 
    }

  },

  // 支付成功后的逻辑
  payOrderSuccess() {
    // 1. 本地存储数据操作
    // 获取购物车数据
    let { cart } = this.data;
    // 过滤出没有选中的商品
    cart = cart.filter(v => !v.isSelect);
    // 把没有选中的商品保存到本地存储中，覆盖掉原本的数据
    wx.setStorageSync('cart', cart);

    // 2. 跳转到订单页面 - 通过页面重定向方式跳转
    wx.redirectTo({
      url: '/pages/order/index'
    });
  }
});